Introducción

Ya hemos iniciado nuestro camino por el universo de R y la Ciencia de Datos.

En el libro R para la Ciencia de Datos, Hadley Wickham y Garrett Grolemund dicen que un típico proyecto de ciencia de datos se ve así:

Fuente: Wickham y Grolemund - R para Ciencia de Datos

Dentro de ese workflow, ahora estamos aprendiendo los primeros tres pasos. En inglés, la jerga para estos pasos se conoce como data wrangling, aunque en castellano podríamos estar hablando de domar los datos.

Domar involucra el 80% del tiempo en un proyecto, y puede dividirse en tres etapas (o dos si damos por sentado que siempre tendremos que importar datos):

  1. La importación de los datos (independientemente de donde esten almacenados).

  2. Ordenar los archivos. Esto implica guardarlos de una forma consistente que haga coincidir la semántica del set de datos con la manera en que está guardado. Para ello los autores hablan de tidy data, de ahí el nombre de nuestro amigo tidyverse (algo así como universo ordenado). Básicamente tidyverse propone que los datos estén ordenados, y el formato sería: cada columna es una variable y cada fila una observación. Este orden nos va a permitir enfocarnos en lo importante, que es hacer las preguntas que nos importan.

  3. Una vez que nuestros datos están ordenados, debemos transformarlos. La transformación implica reducir las observaciones a aquellas que sean de interés (como todas las personas de una ciudad o todos los datos del último año), crear nuevas variables que sean funciones de variables ya existentes (como calcular la rapidez a partir de la velocidad y el tiempo) y calcular una serie de estadísticos de resumen (como recuentos y medias).

Fuente: Wickham y Grolemund - R para Ciencia de Datos

Tidy Data

Antes de empezar a ver como transformamos estas bases de datos, debemos entender un concepto fundamental que es el de una base de datos “tidy”.

Cuando hablamos de datos “ordenados” , o “tidy”, o en formato “largo”, nos referimos a aquellos set de datos en los cuales:

  • cada fila es una observación
  • cada columna es una variable
  • cada valor tiene su propia celda

Fuente: Wickham y Grolemund - R para Ciencia de Datos

¿Por qué asegurarse tidy? Dos ventajas principales:

  1. Existe una ventaja general al elegir una forma consistente de almacenar datos. Si tienes una estructura de datos consistente, es más fácil aprender las herramientas que funcionan con ella ya que tienen una uniformidad subyacente.
  2. Existe una ventaja específica al situar las variables en las columnas, ya que permite que la naturaleza vectorizada de R brille. Muchas de las funciones que vienen con R trabajan con vectores de valores. Esto hace que transformar datos ordenados se perciba como algo casi natural.

To do

Hoy aprenderemos algunas técnicas fundamentales para la transformación de datos. Estas funciones provienen del tidyverse, y principalmente apuntan a unir, pegar, cortar y transformar tablas:

  • bind_rows(): combinar casos
  • bind_cols(): combinar variables
  • _join()
  • pivot_longer() / gather(): de ancho a largo
  • pivot_wider() / spread(): de largo a ancho

bind_rows()

Bind rows nos permite COMBINAR CASOS.

Si no tienen la misma cantidad de columnas (y con diferentes nombres) nos crea esa columna con NA’s.

El comando a utilizar sería

nueva_base <- bind_rows(x,y)

Fuente: Cheatsheet dplyr

  • Tip: si unimos bases y queremos saber de donde vino cada una, antes de unir crear una variable ID (utilizando el comando mutate().
  • Es decir: si tenemos la elección 2021 dividida en Generales y PASO y vamos a aplicar un bind rows, deberíamos tener una columna que sea “eleccion” o “id_eleccion” para luego poder identificar esos casos

bind_cols()

Bind rows nos permite combinar VARIABLES

nueva_base <- bind_cols(x,y)

Fuente: Cheatsheet dplyr

  • IMPORTANTE: Da error si las bases a unir no tienen el mismo largo (cantidad de filas).

  • IMPORTANTE: asegurarse que las filas coincidan. Por ejemplo, si unimos dos bases, deberíamos procurar que la fila 1 de la tabla que unimos sea también la fila 1 de la tabla con la que haremos bind_cols(), sino vamos a tener casos mezclados!!

Veamos un ejemplo con datos reales

Utilizaremos unas bases de datos de las elecciones 2021 celebradas en CABA

#Importar librerias
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ ggplot2 3.3.5     ✔ purrr   0.3.4
## ✔ tibble  3.1.6     ✔ dplyr   1.0.8
## ✔ tidyr   1.2.0     ✔ stringr 1.4.0
## ✔ readr   2.1.2     ✔ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
#Importar data

caba_generales <- read_csv("DATA/caba_grales21.csv") %>% 
  print() #solo para chequear e inspeccionar datos
## Rows: 321103 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (12): eleccion_tipo, recuento_tipo, padron_tipo, distrito_nombre, seccio...
## dbl  (7): año, distrito_id, seccion_id, mesa_electores, agrupacion_id, lista...
## lgl  (3): seccionprovincial_id, seccionprovincial_nombre, circuito_nombre
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 321,103 × 22
##      año eleccion_tipo recuento_tipo padron_tipo distrito_id distrito_nombre    
##    <dbl> <chr>         <chr>         <chr>             <dbl> <chr>              
##  1  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  2  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  3  2021 PASO          PROVISORIO    COMANDO               1 CIUDAD AUTÓNOMA DE…
##  4  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  5  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  6  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  7  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  8  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  9  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
## 10  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
## # … with 321,093 more rows, and 16 more variables: seccionprovincial_id <lgl>,
## #   seccionprovincial_nombre <lgl>, seccion_id <dbl>, seccion_nombre <chr>,
## #   circuito_id <chr>, circuito_nombre <lgl>, mesa_id <chr>, mesa_tipo <chr>,
## #   mesa_electores <dbl>, cargo_nombre <chr>, agrupacion_id <dbl>,
## #   agrupacion_nombre <chr>, lista_numero <dbl>, lista_nombre <chr>,
## #   votos_tipo <chr>, votos_cantidad <dbl>
caba_paso <- read_csv("DATA/caba_paso21.csv") %>% 
    print() #solo para chequear e inspeccionar datos
## Rows: 321103 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (12): eleccion_tipo, recuento_tipo, padron_tipo, distrito_nombre, seccio...
## dbl  (7): año, distrito_id, seccion_id, mesa_electores, agrupacion_id, lista...
## lgl  (3): seccionprovincial_id, seccionprovincial_nombre, circuito_nombre
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 321,103 × 22
##      año eleccion_tipo recuento_tipo padron_tipo distrito_id distrito_nombre    
##    <dbl> <chr>         <chr>         <chr>             <dbl> <chr>              
##  1  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  2  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  3  2021 PASO          PROVISORIO    COMANDO               1 CIUDAD AUTÓNOMA DE…
##  4  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  5  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  6  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  7  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  8  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  9  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
## 10  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
## # … with 321,093 more rows, and 16 more variables: seccionprovincial_id <lgl>,
## #   seccionprovincial_nombre <lgl>, seccion_id <dbl>, seccion_nombre <chr>,
## #   circuito_id <chr>, circuito_nombre <lgl>, mesa_id <chr>, mesa_tipo <chr>,
## #   mesa_electores <dbl>, cargo_nombre <chr>, agrupacion_id <dbl>,
## #   agrupacion_nombre <chr>, lista_numero <dbl>, lista_nombre <chr>,
## #   votos_tipo <chr>, votos_cantidad <dbl>
  • Como veremos, tenemos dos tablas MUY similares, pero una es para las PASO y otra para las elecciones GENERALES. El tamaño de las bases es el mismo,

  • Con el print() podemos verificar que se tratan de elecciones generales y elecciones primarias

Ahora pongamos a prueba nuestros nuevos comandos:

¿Si quiero unir las elecciones primarias y unas elecciones generales, que comando debería utilizar tal y como están las bases?

#Opción A
bind_rows(caba_generales, caba_paso)
## # A tibble: 642,206 × 22
##      año eleccion_tipo recuento_tipo padron_tipo distrito_id distrito_nombre    
##    <dbl> <chr>         <chr>         <chr>             <dbl> <chr>              
##  1  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  2  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  3  2021 PASO          PROVISORIO    COMANDO               1 CIUDAD AUTÓNOMA DE…
##  4  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  5  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  6  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  7  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  8  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
##  9  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
## 10  2021 PASO          PROVISORIO    NORMAL                1 CIUDAD AUTÓNOMA DE…
## # … with 642,196 more rows, and 16 more variables: seccionprovincial_id <lgl>,
## #   seccionprovincial_nombre <lgl>, seccion_id <dbl>, seccion_nombre <chr>,
## #   circuito_id <chr>, circuito_nombre <lgl>, mesa_id <chr>, mesa_tipo <chr>,
## #   mesa_electores <dbl>, cargo_nombre <chr>, agrupacion_id <dbl>,
## #   agrupacion_nombre <chr>, lista_numero <dbl>, lista_nombre <chr>,
## #   votos_tipo <chr>, votos_cantidad <dbl>
#Opción B
bind_cols(caba_generales, caba_paso)
## New names:
## • `año` -> `año...1`
## • `eleccion_tipo` -> `eleccion_tipo...2`
## • `recuento_tipo` -> `recuento_tipo...3`
## • `padron_tipo` -> `padron_tipo...4`
## • `distrito_id` -> `distrito_id...5`
## • `distrito_nombre` -> `distrito_nombre...6`
## • `seccionprovincial_id` -> `seccionprovincial_id...7`
## • `seccionprovincial_nombre` -> `seccionprovincial_nombre...8`
## • `seccion_id` -> `seccion_id...9`
## • `seccion_nombre` -> `seccion_nombre...10`
## • `circuito_id` -> `circuito_id...11`
## • `circuito_nombre` -> `circuito_nombre...12`
## • `mesa_id` -> `mesa_id...13`
## • `mesa_tipo` -> `mesa_tipo...14`
## • `mesa_electores` -> `mesa_electores...15`
## • `cargo_nombre` -> `cargo_nombre...16`
## • `agrupacion_id` -> `agrupacion_id...17`
## • `agrupacion_nombre` -> `agrupacion_nombre...18`
## • `lista_numero` -> `lista_numero...19`
## • `lista_nombre` -> `lista_nombre...20`
## • `votos_tipo` -> `votos_tipo...21`
## • `votos_cantidad` -> `votos_cantidad...22`
## • `año` -> `año...23`
## • `eleccion_tipo` -> `eleccion_tipo...24`
## • `recuento_tipo` -> `recuento_tipo...25`
## • `padron_tipo` -> `padron_tipo...26`
## • `distrito_id` -> `distrito_id...27`
## • `distrito_nombre` -> `distrito_nombre...28`
## • `seccionprovincial_id` -> `seccionprovincial_id...29`
## • `seccionprovincial_nombre` -> `seccionprovincial_nombre...30`
## • `seccion_id` -> `seccion_id...31`
## • `seccion_nombre` -> `seccion_nombre...32`
## • `circuito_id` -> `circuito_id...33`
## • `circuito_nombre` -> `circuito_nombre...34`
## • `mesa_id` -> `mesa_id...35`
## • `mesa_tipo` -> `mesa_tipo...36`
## • `mesa_electores` -> `mesa_electores...37`
## • `cargo_nombre` -> `cargo_nombre...38`
## • `agrupacion_id` -> `agrupacion_id...39`
## • `agrupacion_nombre` -> `agrupacion_nombre...40`
## • `lista_numero` -> `lista_numero...41`
## • `lista_nombre` -> `lista_nombre...42`
## • `votos_tipo` -> `votos_tipo...43`
## • `votos_cantidad` -> `votos_cantidad...44`
## # A tibble: 321,103 × 44
##    año...1 eleccion_tipo...2 recuento_tipo...3 padron_tipo...4 distrito_id...5
##      <dbl> <chr>             <chr>             <chr>                     <dbl>
##  1    2021 PASO              PROVISORIO        NORMAL                        1
##  2    2021 PASO              PROVISORIO        NORMAL                        1
##  3    2021 PASO              PROVISORIO        COMANDO                       1
##  4    2021 PASO              PROVISORIO        NORMAL                        1
##  5    2021 PASO              PROVISORIO        NORMAL                        1
##  6    2021 PASO              PROVISORIO        NORMAL                        1
##  7    2021 PASO              PROVISORIO        NORMAL                        1
##  8    2021 PASO              PROVISORIO        NORMAL                        1
##  9    2021 PASO              PROVISORIO        NORMAL                        1
## 10    2021 PASO              PROVISORIO        NORMAL                        1
## # … with 321,093 more rows, and 39 more variables: distrito_nombre...6 <chr>,
## #   seccionprovincial_id...7 <lgl>, seccionprovincial_nombre...8 <lgl>,
## #   seccion_id...9 <dbl>, seccion_nombre...10 <chr>, circuito_id...11 <chr>,
## #   circuito_nombre...12 <lgl>, mesa_id...13 <chr>, mesa_tipo...14 <chr>,
## #   mesa_electores...15 <dbl>, cargo_nombre...16 <chr>,
## #   agrupacion_id...17 <dbl>, agrupacion_nombre...18 <chr>,
## #   lista_numero...19 <dbl>, lista_nombre...20 <chr>, votos_tipo...21 <chr>, …

Rta correcta: VEMOS EN CLASE y discutimos

_join()

dplyr tiene un potente grupo de operadores para unir tablas en función de una o más variables que compartan ambos datasets y que cuenten con registros únicos en sus observaciones, estas variables serán las claves primarias y foráneas. Es decir, entre una tabla y otra tabla existe una variable o más variables que permiten establecer una relación.

  • Una unión izquierda (left join) mantiene todas las observaciones en x.
  • Una unión derecha (right join) mantiene todas las observaciones en y.
  • Una unión completa (full join) mantiene todas las observaciones en x e y.
  • Una unión interna (inner join) mantiene todas las observaciones presentes tanto en x como en y.

Pueden verlos de forma interactiva aquí

También puede representarse como una serie de diagramas de Venn de la siguiente forma:

Fuente: R4DS

Si alguna vez escuchaste oír de SQL, notarás que esto de los joins puede sonar familiar. Y sí, dplyr se inspiró en SQL.

Fuente: R4DS

Veamos unos ejemplos utilizando datos del portal de datos.gob.ar.

En este caso utilizaremos las bases que contienen el promedio diario de producción de gas y petróleo por provincia.

En primer lugar importaremos las bases y utilizaremos print() para ver las primeras 10 filas

#Paquetes
library(tidyverse)

#Read data
petroleo <- read_csv("http://datos.energia.gob.ar/dataset/590d1284-fd6d-4686-afd8-b3da5d90a6e9/resource/a512fef1-e98e-44af-b940-76168a4bc523/download/produccin-de-petrleo-promedio-diaria-por-provincia.csv") %>% 
  print()
## Rows: 2025 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): indice_tiempo, provincia
## dbl (3): anio, mes, produccion_petroleo_promedio_dia_m3
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 2,025 × 5
##     anio   mes indice_tiempo provincia       produccion_petroleo_promedio_dia_m3
##    <dbl> <dbl> <chr>         <chr>                                         <dbl>
##  1  2009     1 2009-01       Chubut                                      25615. 
##  2  2009     1 2009-01       Estado Nacional                               684. 
##  3  2009     1 2009-01       Formosa                                       417. 
##  4  2009     1 2009-01       Jujuy                                          46.5
##  5  2009     1 2009-01       La Pampa                                     3925. 
##  6  2009     1 2009-01       La Rioja                                        0  
##  7  2009     1 2009-01       Mendoza                                     15650. 
##  8  2009     1 2009-01       Neuquén                                     22097. 
##  9  2009     1 2009-01       Rio Negro                                    5885. 
## 10  2009     1 2009-01       Salta                                        1662. 
## # … with 2,015 more rows
gas <- read_csv("http://datos.energia.gob.ar/dataset/590d1284-fd6d-4686-afd8-b3da5d90a6e9/resource/3d37d4f3-9b65-488e-9e64-bcd7483719fa/download/produccin-de-gas-promedio-diaria-por-provincia.csv") %>% 
  print()
## Rows: 1992 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): indice_tiempo, provincia
## dbl (3): anio, mes, produccion_gas_promedio_dia_mm3
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 1,992 × 5
##     anio   mes indice_tiempo provincia        produccion_gas_promedio_dia_mm3
##    <dbl> <dbl> <chr>         <chr>                                      <dbl>
##  1  2014     9 2014-09       Mendoza                                  6453.  
##  2  2021     7 2021-07       Chubut                                   8063.  
##  3  2019     1 2019-01       Jujuy                                       9.16
##  4  2011     2 2011-02       Formosa                                    72.0 
##  5  2011    11 2011-11       La Pampa                                 1269.  
##  6  2013     9 2013-09       San Juan                                    0   
##  7  2021     6 2021-06       Santa Cruz                               9545.  
##  8  2016    10 2016-10       La Pampa                                 1019.  
##  9  2018     8 2018-08       Tierra del Fuego                        12112.  
## 10  2016     3 2016-03       Estado Nacional                         13075.  
## # … with 1,982 more rows

Como podemos ver arriba, ambas bases son muy parecidas, cada observación es la producción promedio mensual de una jurisdicción.

Tenemos 2.025 observaciones para la producción de petróleo, y 1992 observaciones para la producción de gas.

Ahora bien, a fines prácticos de nuestro ejercicio nos quedaremos solo con los datos de producción de 2021 y haremos un par de consultas a nuestras bases.

# Paso 1, Filtamos nuestras bases.

petroleo_2021 <- petroleo %>% 
  filter(anio == 2021)

gas_2021 <- gas %>% 
  filter(anio == 2021)

Digamos que queremos saber que provincias productoras de petroleo en 2021 produjeron gas en el mismo año.

Podríamos resolver nuestra pregunta de la siguiente forma

left_join(petroleo_2021, gas_2021) %>% #primero hacemos un left join
  select(provincia) %>% #seleccionamos solo la variable provincia
  unique() #quedamos con casos únicos
## Joining, by = c("anio", "mes", "indice_tiempo", "provincia")
## # A tibble: 11 × 1
##    provincia       
##    <chr>           
##  1 Chubut          
##  2 Estado Nacional 
##  3 Formosa         
##  4 Jujuy           
##  5 La Pampa        
##  6 Mendoza         
##  7 Neuquén         
##  8 Rio Negro       
##  9 Salta           
## 10 Santa Cruz      
## 11 Tierra del Fuego

Y si queremos saber que provincias productoras de gas en 2021 producen petróleo?

Podríamos resolver nuestra pregunta de la siguiente forma

right_join(petroleo_2021, gas_2021) %>% 
  select(provincia) %>% 
  unique()
## Joining, by = c("anio", "mes", "indice_tiempo", "provincia")
## # A tibble: 11 × 1
##    provincia       
##    <chr>           
##  1 Chubut          
##  2 Estado Nacional 
##  3 Formosa         
##  4 Jujuy           
##  5 La Pampa        
##  6 Mendoza         
##  7 Neuquén         
##  8 Rio Negro       
##  9 Salta           
## 10 Santa Cruz      
## 11 Tierra del Fuego

Como vemos, las provincias productoras de petróleo son las mismas provincias productoras de gas… Pero podría haber sido distinto.

Dejaremos inner_join() y full_join() para que puedan practicarlos luego.

pivot_longer() y pivot_wider()

pivot_longer(): de ancho a largo

Lo usamos cuando los nombres de las columnas no representan las variables sino que figuran como registros en las filas.

Fuente: DNME - Ministerio de Turismo y Deportes de la Nación

Ahora lo veamos con un ejemplo.

Primero crearemos una base de datos “de juguete”:

#Importamos paquetes
library(tidyverse)
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
### Armo base de datos
plantel <- tibble::tibble(Apellido.y.Nombre = c("Martinez, Lisandro","Messi, Lionel","Di María, Angel","Alvarez, Julian","Armani, Franco"),
                          Posicion = c("Defensor", "Delantero", "Delantero", "Delantero","Arquero"),
                          Club.actual = c("Manchester United", "Paris Saint Germain", "Juventus", "Manchester City","River Plate"),
                          Club.origen = c("Newell's Old Boys", "Barcelona", "Rosario Central", "River Plate","Ferro")) %>% 
  clean_names()

plantel
## # A tibble: 5 × 4
##   apellido_y_nombre  posicion  club_actual         club_origen      
##   <chr>              <chr>     <chr>               <chr>            
## 1 Martinez, Lisandro Defensor  Manchester United   Newell's Old Boys
## 2 Messi, Lionel      Delantero Paris Saint Germain Barcelona        
## 3 Di María, Angel    Delantero Juventus            Rosario Central  
## 4 Alvarez, Julian    Delantero Manchester City     River Plate      
## 5 Armani, Franco     Arquero   River Plate         Ferro

Ahora aplicamos pivot_longer, ven el cambio?

plantel_largo <- plantel %>% 
  pivot_longer(cols = c(club_actual, club_origen),
               names_to = "tipo_club",
               values_to = "club")
plantel_largo
## # A tibble: 10 × 4
##    apellido_y_nombre  posicion  tipo_club   club               
##    <chr>              <chr>     <chr>       <chr>              
##  1 Martinez, Lisandro Defensor  club_actual Manchester United  
##  2 Martinez, Lisandro Defensor  club_origen Newell's Old Boys  
##  3 Messi, Lionel      Delantero club_actual Paris Saint Germain
##  4 Messi, Lionel      Delantero club_origen Barcelona          
##  5 Di María, Angel    Delantero club_actual Juventus           
##  6 Di María, Angel    Delantero club_origen Rosario Central    
##  7 Alvarez, Julian    Delantero club_actual Manchester City    
##  8 Alvarez, Julian    Delantero club_origen River Plate        
##  9 Armani, Franco     Arquero   club_actual River Plate        
## 10 Armani, Franco     Arquero   club_origen Ferro

pivot_wider(): de largo a ancho

Lo usamos cuando la observación de una unidad está distribuida en múltiples filas.

pivot_wider(table2, names_from = type, values_from = count)

Si queremos retrotraer nuestro ejemplo, como hacemos?

plantel_ancho <- plantel_largo %>% 
  pivot_wider(names_from = tipo_club,
              values_from = club)
plantel_ancho
## # A tibble: 5 × 4
##   apellido_y_nombre  posicion  club_actual         club_origen      
##   <chr>              <chr>     <chr>               <chr>            
## 1 Martinez, Lisandro Defensor  Manchester United   Newell's Old Boys
## 2 Messi, Lionel      Delantero Paris Saint Germain Barcelona        
## 3 Di María, Angel    Delantero Juventus            Rosario Central  
## 4 Alvarez, Julian    Delantero Manchester City     River Plate      
## 5 Armani, Franco     Arquero   River Plate         Ferro

En resumen

  • En su versión anterior, pivot_longer() se llamaba gather() y pivot_wider se llamaba spread(). Para profundizar al respecto pueden ver este video

Ejercicios

  1. Abrir RStudio y crear un nuevo proyecto de R.

  2. Utilizar los datos de PASO y generales de las elecciones 2021 en CABA, y guardarlos en la carpeta “data” dentro del proyecto.

  3. Calcular la cantidad de votos TOTALES en PASO y Generales de cada agrupación política en la categoría Diputado Nacional.

Tip: puedes usar filter(), select(), group_by() y summarise()

  1. Calcular la cantidad de electores por comuna

  2. Transformar la base de datos larga (cada agrupación política una fila) en una base ancha (cada agrupación política una columna)

  3. Una vez finalizado el ejercicio, generar el reporte HTML con “Knit”.